#include "AVDeMuxer.h"
#include <QDebug>
extern"C"
{
    #include<libavformat/avformat.h>
}
using AVPacketPtr=std::shared_ptr<AVPacket>;
using AVFramePtr=std::shared_ptr<AVFrame>;//别名
AVDeMuxer::AVDeMuxer()
    :quit_(false)//初始化
{
    //创建解封装上下文
    pFormatCtx_=avformat_alloc_context();
    //设置参数
    pFormatCtx_->max_ts_probe=50;
    pFormatCtx_->interrupt_callback.callback=InterruptFountion;
    pFormatCtx_->interrupt_callback.opaque=this;
    //加速拉流
    pFormatCtx_->flags|=AVFMT_FLAG_DISCARD_CORRUPT;
}

bool AVDeMuxer::Open(const QString path)
{
    //打开流地址 https://ip:port
    //启动线程
    readThread_.reset(new std::thread([this,path](){this->FetchStream(path);}));//[](){}匿名函数
    return true;
}

void AVDeMuxer::Close()
{
    //将标志位置位置为0
    quit_=true;
    //释放资源
    if(readThread_)
    {
        readThread_.reset();
        readThread_=nullptr;
    }
    //封装格式上下文释放资源
    if(pFormatCtx_)
    {
        avformat_free_context(pFormatCtx_);
    }
}

void AVDeMuxer::FetchStream(const QString path)
{
    //获取流信息
    bool ret=true;
    if(streamCb_)
    {
        ret=FetchSteamInfo(path);
        streamCb_(ret);
    }
    if(!ret)
    {
        return;
    }
    //创建一个packet，来接受编码数据
    AVPacketPtr packet=nullptr;
    while(!quit_&&pFormatCtx_){
        packet=AVPacketPtr(av_packet_alloc(),[](AVPacket*p){av_packet_free(&p);});
        //开始读取数据
        int re=av_read_frame(pFormatCtx_,packet.get());
        if(re==0)
        {
            if(packet->stream_index==videoIndex)
            {
                //视频包数据
                //开始解码音视频数据包
                qDebug()<<"视频包";
            }
            else if(packet->stream_index==AudioIndex)
            {
                //音频包数据
                qDebug()<<"音频包";
            }
        }
        else
        {
            av_packet_unref(packet.get());
            break;
        }
    }
}

bool AVDeMuxer::FetchSteamInfo(const QString path)
{
    //获取流信息
    if(avformat_open_input(&pFormatCtx_,path.toStdString().c_str(),nullptr,nullptr)!=0)
    {
        qDebug()<<"avformat_open_input failed";
        return false;
    }
    //查询流信息
    if(avformat_find_stream_info(pFormatCtx_,nullptr)<0)
    {
        qDebug()<<"avformat_find_stream_info failed";
        return false;
    }
    //遍历流信息
    for(int i=0;i<pFormatCtx_->nb_streams;i++)
    {
        if(pFormatCtx_->streams[i]->codecpar->codec_type==AVMEDIA_TYPE_VIDEO)
        {
            //更新视频索引
            videoIndex=i;
        }
        else if(pFormatCtx_->streams[i]->codecpar->codec_type==AVMEDIA_TYPE_AUDIO)
        {
            //更新音频索引
            AudioIndex=i;
        }
        else
        {
            continue;
        }
    }
    if(videoIndex!=-1)
    {
        //当前有视频
        //初始化视频解码器
        qDebug()<<"含有视频流";

    }
    if(AudioIndex!=-1)
    {
        //当前有音频
        //初始化音频解码器
        qDebug()<<"含有视频流";
    }
    return true;
}

int AVDeMuxer::InterruptFountion(void *arg)
{
    AVDeMuxer*thiz=(AVDeMuxer*)arg;
    return thiz->quit_;//0运行 1 停止
}


